//https://www.nowcoder.com/practice/d11471c3bf2d40f38b66bb12785df47f?tpId=13&tqId=2283174&ru=/exam/oj/ta&qru=/ta/coding-interviews/question-ranking&sourceUrl=%2Fexam%2Foj%2Fta%3Fpage%3D1%26tpId%3D13%26type%3D13
//https://leetcode.cn/problems/string-to-integer-atoi/
//思想：1.首先处理空字符；2.处理正负号；3.处理数字及边界条件比对；
//思想2：使用 longlong 更容易理解这种方式；

#include <iostream>
#include <string>
#include <vector>
#include <climits>

using namespace std;

class Solution1 {
  public:
    int StrToInt(string s) {
        int res = 0;
        int index = 0;
        int n = s.length();
        //去掉前导空格，如果有
        while (index < n) {
            if (s[index] == ' ')
                index++;
            else
                break;
        }
        //去掉空格就什么都没有了
        if (index == n)
            return 0;
        int sign = 1;
        //处理第一个符号是正负号的情况
        if (s[index] == '+')
            index++;
        else if (s[index] == '-') {
            index++;
            sign = -1;
        }
        //去掉符号就什么都没有了
        if (index == n)
            return 0;
        while (index < n) {
            char c = s[index];
            //后续非法字符，截断
            if (c < '0' || c > '9')
                break;
            //处理越界
            if (res > INT_MAX / 10 || (res == INT_MAX / 10 && (c - '0') > INT_MAX % 10))
                return INT_MAX;
            if (res < INT_MIN / 10 || (res == INT_MIN / 10 && (c - '0') > -(INT_MIN % 10)))
                return INT_MIN;
            res = res * 10 + sign * (c - '0');
            index++;
        }
        return res;
    }
};


class Solution {
public:
    int myAtoi(string s) {
        // 将结果先声明为 long long，溢出时即时处理。
        // 不转换也有处理方式，但多了些心智负担。
        long long num = 0;
        int n = s.length();

        // 跳过前导空格
        int i = 0;
        while (i < n && s[i] == ' ') i++;
        if (i == n) return 0;

        // 判断正负，flag 用于最后与 num 相乘作为结果
        int flag = 1; // 无符号时为 1 (正)，i 不用前进
        if (s[i] == '-') {
            flag = -1;
            i++;
        } else if (s[i] == '+') {
            i++;
        }

        // 跳过前导 0 
        while (i < n && s[i] == '0') i++;
        if (i == n) return 0;

        // 开始读取数字
        for (; i < n; i++) {
            char c = s[i];
            
            // 遇到除数字外的字符退出
            if (c < '0' || c > '9') break;

            // 得到无符号的新数字
            num = num * 10 + (c - '0');
            
            // 看带符号的新数字是否溢出或者到达最大/最小
            long long v = num * flag;
            if (v >= INT_MAX) return INT_MAX;
            if (v <= INT_MIN) return INT_MIN;
        }

        return num * flag;
    }
};

// 处理前空格*********
// while(index<s.length() && s[index] == ' ') {
//     ++index;
// }
// if(index == s.size()) {
//     return 0;
// }
// auto sub_str=s.substr(index,s.size());
// // 处理尾部空格
// while(sub_str.size()>0&&sub_str.back()==' ') {
//     sub_str.pop_back();
// }
// if(sub_str.empty()){
//     return 0;
// }



